import java.util.Scanner;

/**
 * 影院管理系统入口
 * 运行命令：javac Main.java && java Main
 */
public class Main {
    private static CinemaSystem system = new CinemaSystem();
    public static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        system.initUsers();
        login();
        sc.close();
    }

    // 登录功能
    public static void login() {
        System.out.print("请输入用户名：");
        String username = sc.nextLine();
        System.out.print("请输入密码：");
        String password = sc.nextLine();

        // 校验用户名和密码
        for (User user : system.getUsers()) {
            System.out.println("Checking user: " + user.getUsername());
            System.out.println("Expected username: " + username + ", password: " + password);
            if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
                System.out.println("登录成功！欢迎 " + user.getRole() + ": " + username);
                showMenu(user); // 进入对应角色的菜单
                return;
            }
        }

        // 登录失败处理
        System.out.println("用户名或密码错误，请重新登录！");
        login(); // 重新登录
    }

    // 根据用户角色展示对应菜单
    private static void showMenu(User user) {
        while (true) { // 循环展示菜单，直到退出登录
            System.out.println("\n===== 功能菜单 =====");
            switch (user.getRole()) {
                case "管理员":
                    showAdminMenu();
                    handleAdminChoice(user);
                    break;
                case "经理":
                    showManagerMenu();
                    handleManagerChoice(user);
                    break;
                case "前台":
                    showFrontMenu();
                    handleFrontChoice(user);
                    break;
                default:
                    System.out.println("无效角色，强制退出登录！");
                    login(); // 回到登录页
            }
        }
    }

    // 管理员菜单
    private static void showAdminMenu() {
        System.out.println("1. 用户管理  2. 密码修改  3. 退出登录");
        System.out.print("请选择功能（输入数字）：");
    }

    // 处理管理员选择
    private static void handleAdminChoice(User user) {
        int choice = sc.nextInt();
        sc.nextLine(); // 清除输入缓冲区（避免残留换行符）

        switch (choice) {
            case 1:
                system.getAdminService().manage(); // 调用管理员的用户管理功能
                break;
            case 2:
                UserUtil.changePassword(user); // 调用密码修改功能
                break;
            case 3:
                System.out.println("已退出登录");
                login(); // 回到登录页
                break;
            default:
                System.out.println("无效选择，请重新输入！");
        }
    }

    // 经理菜单
    private static void showManagerMenu() {
        System.out.println("1. 影片管理  2. 排片管理  3. 销售数据  4. 退出登录");
        System.out.print("请选择功能（输入数字）：");
    }

    // 处理经理选择
    private static void handleManagerChoice(User user) {
        int choice = sc.nextInt();
        sc.nextLine(); // 清除输入缓冲区

        switch (choice) {
            case 1:
                system.getMovieService().manage(); // 调用影片管理功能
                break;
            case 2:
                system.getSessionService().manage(); // 调用排片管理功能
                break;
            case 3:
                showSales(); // 调用销售数据查看功能
                break;
            case 4:
                System.out.println("已退出登录");
                login(); // 回到登录页
                break;
            default:
                System.out.println("无效选择，请重新输入！");
        }
    }

    // 前台菜单
    private static void showFrontMenu() {
        System.out.println("1. 查看影片  2. 售票  3. 退票  4. 退出登录");
        System.out.print("请选择功能（输入数字）：");
    }

    // 处理前台选择
    private static void handleFrontChoice(User user) {
        int choice = sc.nextInt();
        sc.nextLine(); // 清除输入缓冲区

        switch (choice) {
            case 1:
                system.getMovieService().showList();; // 调用查看影片功能
                break;
            case 2:
                system.getFrontService().sellTicket(); // 调用售票功能
                break;
            case 3:
                system.getFrontService().refundTicket(); // 调用退票功能
                break;
            case 4:
                System.out.println("已退出登录");
                login(); // 回到登录页
                break;
            default:
                System.out.println("无效选择，请重新输入！");
        }
    }

    /**
     * 展示当天的放映场次
     */
    public static void showSessions() {
        System.out.println("\n===== 放映场次 =====");
        if (system.getSessions().isEmpty()) {
            System.out.println("暂无放映场次信息！");
            return;
        }
        for (Session session : system.getSessions()) {
            System.out.println("ID: " + session.getId()
                    + " | 影片: " + session.getMovie().getName()
                    + " | 放映厅: " + session.getHall().getName()
                    + " | 价格: " + session.getPrice());
        }
    }

    public static void showSales() {
        System.out.println("\n===== 销售数据 =====");
        double total = 0;
        for (Ticket t : system.getTickets()) {
            if (!t.isRefunded()) {
                total += t.getPrice();
            }
        }
        System.out.println("总售票数：" + system.getTickets().size() + " | 总销售额：" + total + "元");
    }
}
